#include "widget.h"
#include "ui_widget.h"

#include <QLabel>
#include <QDebug>
#include <iostream>
#include <QLineEdit>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //显示字符串-----------------------------------------------------------------------------------------
    //更推荐在堆上创建的方式,将对象放到对象数上，等到文件关闭时，统一进行销毁
    QLabel* label = new QLabel(this);//标签控件
    //QLabel label;
    label->setText("Hello QLabel");
    //文本编辑框-----------------------------------------------------------------------------------------
    QLineEdit* edit = new QLineEdit(this);
    edit->setText("Hello QLineEdit");
    edit->move(0,50);
    //按钮----------------------------------------------------------------------------------------------
    button = new QPushButton(this);
    button->setText("Hello QPushButton");
    button->move(0,100);
    connect(button, &QPushButton::clicked, this, &Widget::handleClick);
    //关闭窗口按钮点击事件--------------------------------------------------------------------------------
    QPushButton* button2 = new QPushButton(this);
    button2->setText("Close");
    button2->move(300,100);
    connect(button2, &QPushButton::clicked, this, &Widget::close);
    //自定义信号----------------------------------------------------------------------------------------
    connect(this,&Widget::mySignal,this,&Widget::handleMySignal);
    connect(this,&Widget::mySignal,this,[this](const QString& text){
        qDebug() << "lambda表达式调用成功";
        this->move(300,300);
    });
}

Widget::~Widget()
{
    //-------------------------------------测试统一析构和编码方式------------------------------------------
    //std::cout << "析构！！！" << std::endl;//出现乱码，因为编码方式不一样，utf8和GBK两种编码方式
    //QDebug是Qt中的的一个类，qDebug()这个宏封装了这个宏，直接使用这个就可以打印了
    //而且qDebug可以通过编译开关，全部一键关闭（不再执行输出）
    qDebug() << "析构了！";
    //-------------------------------------------------------------------------------------------------

    delete ui;
}

void Widget::handleClick()
{
    if(button->text() == QString("Hello QPushButton"))
        button->setText("Hello Button");
    else
        button->setText("Hello QPushButton");
}

void Widget::handleMySignal(const QString& text)
{
    //this->setWindowTitle("自定义信号");
    this->setWindowTitle(text);
}

void Widget::handleClick2()
{
    this->setWindowTitle("更改自定义信号");
}

//通过图形化界面拖拽创建的一个按钮->转到槽，自动生成的响应函数，这样就会自动建立连接，不需要再手动建立连接
void Widget::on_pushButton_clicked()
{
    //发送自定义信号，可以在任意位置发送信号
    //emit mySignal();//不写emit也可以
    QString text = "自定义信号";
    mySignal(text);
}

void Widget::on_pushButton_2_clicked()
{
    //断开信号和槽的连接，如果不进行此操作，一个信号就会绑定两个槽函数，触发时都会执行
    disconnect(this,&Widget::mySignal,this,&Widget::handleMySignal);
    //重新建立新的连接
    connect(this,&Widget::mySignal,this,&Widget::handleClick2);
}
